#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QScrollArea>
#include <QScrollBar>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <Qpainter>
#include <QPainterPath>
#include <QTimer>
#include <QMenu>


#include "model/data.h"
#include "debug.h"
#include "userinfowidget.h"
#include "model/datacenter.h"

// .h 文件中不宜进行 using namspace xxxx
using model::Message;


/////////////////////////////////////////////////////////////////
// 表示消息展示区
/////////////////////////////////////////////////////////////////

class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageShowArea();

    //尾插
    void addMessage(bool isLeft, const Message& message);
    //头插
    void addFontMessaage(bool isLeft, const Message& message);
    //清空消息
    void clear();
    // 滚动到末尾
    void scrollToEnd();
private:
    QWidget* container;
};

/////////////////////////////////////////////////////////////////
// 表示一个消息展示区
// 这个里面要能同时支持 文本消息, 图片消息, 文件消息, 语言消息,
// 当前先只考虑文本消息, 另外几个后续慢慢添加
/////////////////////////////////////////////////////////////////

class MessageItem : public QWidget{
    Q_OBJECT
public:
    //此处的 isLeft 表示这个Item 是否是一个 "左侧消息"
    MessageItem(bool isLeft);

    // 通过工厂方法 创建 MessageItem 实例
    static MessageItem* makeMessageItem(bool isLeft, const Message& message);

    // 添加工厂函数
    static QWidget* makeTextMessageItem(bool isLeft, const QString& text);
    static QWidget* makeImageMessageItem(bool isLeft, const QString& fileId, const QByteArray& content);
    static QWidget* makeFileMessageItem(bool isLeft, const Message& message);
    static QWidget* makeSpeechMessageItem(bool isLeft, const Message& message);
private:
    bool isLeft;
};

/////////////////////////////////////////////////////////////////
// 创建类表示 "文本消息" 正文部分
// 也让这个类表示 "文件消息"
/////////////////////////////////////////////////////////////////

class MessageContentLabel : public QWidget {
public:
    MessageContentLabel(const QString& text, bool isLeft, model::MessageType messageType, const QString& fileId,
        const QByteArray& content);

    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;

    void updateUI(const QString& fileId, const QByteArray& fileContent);
    void saveAsFile(const QByteArray& content);

    void playDone();

    // 右键点击语音, 弹出一个菜单, 有语音转文字的选项
    void contextMenuEvent(QContextMenuEvent* event) override;
    void speechConvertTextDone(const QString& fileId, const QString& text);
private:
    QLabel* label;
    bool isLeft;

    model::MessageType messageType;
    QString fileId;
    QByteArray content;

    // 设置这个变量, 主要是为了防止用户上传的就是一个空文件, 导致我们代码逻辑判断是否为空就有问题, 所以有了这个变量
    bool loadContentDone = false;
};
/////////////////////////////////////////////////////////////////
// 创建类表示 "图片消息" 正文部分
/////////////////////////////////////////////////////////////////

class MessageImageLabel : public QWidget{
    Q_OBJECT
public:
    MessageImageLabel(const QString& fileId, const QByteArray& content, bool isLeft);

    void updateUI(const QString& fileId, const QByteArray& content);
    void paintEvent(QPaintEvent* event);
private:
    QPushButton* imageBtn;

    QString fileId;             // 该图片在服务器对应的文件 id
    QByteArray content;         // 图片的二进制数据
    bool isLeft;
};
#endif // MESSAGESHOWAREA_H



















